package reflect;

import bean.User;

import java.io.FileReader;
import java.util.Properties;

/**
 * 验证反射机制的灵活性。
 *  java代码写一遍，再不改变java源代码的基础之上，可以做到不同对象的实例化。
 *  非常之灵活。(复合OCP开闭原则: 对扩展开放，对修改关闭。)
 *
 *  使用高级框架:
 *      ssh ssm
 *      Spring SpringMVC MyBatis
 *      Spring Struts Hibernate
 *      ...
 *      这些高级框架底层实现原理: 都采用了反射机制。所以反射机制还是非常重要的。
 *      大部分时间在写配置文件。
 */
public class ReflectTest03 {
    public static void main(String[] args) throws Exception {

        // 不使用反射机制，创建对象
        // 这种方式代码就写死了。只能创建一个User类型的对象。
        User user = new User();
        System.out.println(user);


        // 以下代码是灵活的，代码不需要改动，可以修改配置文件，配置文件修改后，可以创建不同的对象。
        // 通过IO流读取classinfo.properties文件
        FileReader fileReader = new FileReader("Reflect/classinfo.properties");
        // 创建属性类对象Map
        // key和value都是String类型。
        Properties properties = new Properties();
        // 加载
        properties.load(fileReader);
        // 关闭流
        fileReader.close();

        // 通过key获取value
        String className = properties.getProperty("className");
        System.out.println(className);

        // 通过反射机制创建对象。
        Class c = Class.forName(className);
        Object o = c.newInstance();
        System.out.println(o);
    }
}
